var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
var cache = {};
var chatServer = require('lib/chat_server')
chatServer.listen(server)
// 请求文件不存在是发送404
function send404(res) {
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.write('Error 404: resourse nnot fount');
    res.end();
}
// 发送文件内容
function sendFile(res, filePath, fileContents) {
    res.writeHead(200, {'content-type': mime.lookup(path.basename(filePath))});
    res.end(fileContents);
}
// 访问内存（RAM）比访问系统文件速度快得多，所以node程序通常会把常用的数据缓存到内存里。
// 我们的聊天程序就要吧静态文件缓存到内存中，只有第一次访问的时候才会从文件系统中读取。
// 确定文件您是否缓存了，如果是，就返回它。
// 如果文件你还没被缓存，它会从硬盘中读取并返回它。
// 如果文件内部存在，则返回一个HTTP404错误作为响应。
function serveStatic(res, cache, absPath) {
    if (cache[absPath]) {                                                  //检查文件是否缓存在内存中
        sendFile(res, absPath, cache[absPath]);                            //从内存中返回文件
    }else{
        fs.exists(absPath, function (exists) {                            //检查文件是否存在
            if (exists) {
                fs.readFile(absPath, function (err, data) {               //从硬盘中读取文件
                    if (err) {
                        send404(res);
                    } else {
                        cache[absPath] = data;                             //加入缓存
                        sendFile(res, absPath, data);                      //从硬盘中读取文件并返回
                    }
                });
            } else {
                send404(res);                                              //响应404
            }
        });
    }
};

// 创建HTTP服务器
// 在创建HTTP服务是，需要给createServer传入一个匿名函数，由它来处理与每个HTTP请求。
// 这个回调函数接受2两个参数，req和res。
// 在这个回调执行时，HTTP服务器会分别组装这两个参数对象，以便你可以对请求的细节进行处理，并返回一个响应。
var server = http.createServer(function (request, response) {                     //创建HTTp服务器，用匿名函数定义对每个请求的处理行为
    var filePath = false;
    if (request.url == '/') {
        filePath = 'public/index.html';                                   //确定返回的默认HTML文件的相对路径
    }  else {
        filePath = 'public' + request.url;                                    //将URL路径转为文件的相对路径
    }
    var absPath = './' + filePath;
    serveStatic(response, cache, absPath);                                     //返回静态文件
})
server.listen(3000, function () {
    console.log("server listening on 3000");
})
